package com.dragon.common.spring.business.base;

import com.chris.dev.base.libs.v1.http.results.PageResult;
import com.dragon.common.spring.utils.PageResultUtil;
import org.springframework.data.domain.Page;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @param <E> 实体类型
 * @param <P> 创建参数类型
 * @param <U> 更新参数类型
 * @param <R> 结果类型
 * @author Chris Chan
 * Create On 2025/8/26 下午5:49
 * Use for: 基础转换器
 * Explain: 基础转换器
 */
public interface BaseConverter<E, P, U, R> {
    /**
     * 从Create参数转换为Entity实体
     *
     * @param param 创建参数
     * @return 实体
     */
    E fromParam(P param);

    /**
     * 从Update参数转换为Entity实体
     *
     * @param param 更新参数
     * @return 实体
     */
    E fromUpdateParam(U param);

    /**
     * 从Entity实体转换为Result结果
     *
     * @param entity 实体
     * @return 结果
     */
    R toResult(E entity);

    /**
     * 从Create参数列表转换为Entity实体列表
     *
     * @param paramList 创建参数列表
     * @return 实体列表
     */
    default List<E> fromParamList(List<P> paramList) {
        if (CollectionUtils.isEmpty(paramList)) {
            return new java.util.ArrayList<>();
        }
        return paramList.stream().map(this::fromParam).collect(Collectors.toList());
    }

    /**
     * 从Update参数列表转换为Entity实体列表
     *
     * @param paramList 更新参数列表
     * @return 实体列表
     */
    default List<E> fromUpdateParamList(List<U> paramList) {
        if (CollectionUtils.isEmpty(paramList)) {
            return new java.util.ArrayList<>();
        }
        return paramList.stream().map(this::fromUpdateParam).collect(Collectors.toList());
    }

    /**
     * 从Entity实体列表转换为Result结果列表
     *
     * @param entityList 实体列表
     * @return 结果列表
     */
    default List<R> toResultList(List<E> entityList) {
        if (CollectionUtils.isEmpty(entityList)) {
            return new java.util.ArrayList<>();
        }
        return entityList.stream().map(this::toResult).collect(Collectors.toList());
    }

    /**
     * 从Entity实体分页转换为Result结果分页
     *
     * @param entityPage 实体分页
     * @return 结果分页
     */
    default PageResult<R> toResultPage(Page<E> entityPage) {
        return PageResultUtil.map(entityPage, this::toResult);
    }
}
